package com.supsi.segretaria.server;

import javax.swing.event.EventListenerList;

/**
 * Fornisce l'ambiente necessario per la communicazione del utente  con il sistema. 
 * User: Ognjen
 * Date: 04.05.12
 */
public class UserContainer {
    private String username;
    private DBServer dbServer;
    private MessageQueue userMq;
    private EventListenerList eventListeners = new EventListenerList();

    /*
        Crea userContainer
     */
    public UserContainer(String username) {
        this.username = username;
        dbServer = DBServer.getInstance();
        userMq = new MessageQueue(username);
    }

    /*
        Invia il messaggio ad un'altro utente
        @param String userTo - nome del utente a qualle inviare il messaggio
        @param String message - il testo del messaggio
        @return true - se messaggio e' salvato, false se no.
     */
    public boolean sendMessage(String userTo, String message){
        boolean success = dbServer.insertMessage(username, userTo, message);
        MailSystem.getMailSystem().notifyNewMessage(userTo);
        return success;
    }

    /*
        Ritorna il MessageQueue del utente attuale 
     */
    public MessageQueue getUserMq() {
        return userMq;
    }

    /**
     * Ritorna il nome utente del proprietario di questo queue
     * @return
     */
    public String getUsername() {
        return username;
    }

    /**
     * Il metodo usato dal MailSystem per avvisare questo container che c'e' il nuovo messaggio
     * per questo utente.
     */
    public void newMesssageArrived() {
        NewMessageEvent evt = new NewMessageEvent(this);
        Object[] listeners = eventListeners.getListenerList();
        for (int i=0; i< listeners.length; i++){
            if (listeners[i] == NewMessageEventListener.class){
                ((NewMessageEventListener)listeners[i+1]).newMessageArrived(evt);
            }
        }
    }

    /**
     * Aggiunge un nuovo eventListener nella lista dei subscribers
     * @param evt
     */
    public void addNewMessageEventListener(NewMessageEventListener evt){
        eventListeners.add(NewMessageEventListener.class, evt);
    }

    /**
     * Toglie event listener dalla lista dei subscribers
     * @param evt
     */
    public void removeNewMessageEventListener(NewMessageEventListener evt){
        eventListeners.remove(NewMessageEventListener.class, evt);
    }

}
